package com.holly.unit.gen.starter.core;

import com.holly.unit.gen.api.config.GenCodeCfg;
import com.holly.unit.gen.api.config.GenFileCfg;
import com.holly.unit.gen.api.pojo.TableInfo;
import com.holly.unit.gen.starter.config.*;
import com.holly.unit.gen.starter.config.builder.ConfigBuilder;
import com.holly.unit.gen.starter.engine.AbstractTemplateEngine;
import com.holly.unit.gen.starter.engine.FreemarkerTemplateEngine;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;

/**
 * 类描述: 代码生成器核心逻辑
 *
 * @author fxr
 * @version 1.0.0
 * @date 2022/1/19 17:03
 */
@Slf4j
@Data
@Accessors(chain = true)
public class AutoGenCodeCore {

    /**
     * 配置信息 所有的配置信息
     */
    private ConfigBuilder config;

    private DataSourceConfig dataSourceConfig;

    private GlobalConfig globalConfig;

    private PackageConfig packageConfig;

    private StrategyConfig strategyConfig;

    private TemplateConfig templateConfig;

    private TableInfo tableInfo;

    /**
     * 模板引擎
     */
    private AbstractTemplateEngine templateEngine;

    // 代码生成器模板方法
    public void execute() throws Exception{

        if (null == config) {
            config = new ConfigBuilder(packageConfig, dataSourceConfig, strategyConfig, templateConfig, globalConfig,tableInfo);
        }

        log.debug("==========================准备生成文件...==========================");

        if (null == templateEngine) {
            // 为了兼容之前逻辑，采用 Freemarker 引擎 【 默认 】
            templateEngine = new FreemarkerTemplateEngine();
        }
        // 模板引擎,执行初始化，然后根据模板，把代码生成到projectPath路径下
        templateEngine.init(this.pretreatmentConfigBuilder(config)).batchOutput(config);

        log.debug("==========================文件生成完成！！！==========================");
    }

    /***
     * 预处理配置
     * @param config 总配置信息
     * @return 解析数据结果集
     */
    private ConfigBuilder pretreatmentConfigBuilder(ConfigBuilder config) throws Exception{

        String templatePath = config.getTemplateConfig().getTemplatePath();
        if (trimHeadAndTailChar(templatePath,"/").equals("holly/codeTemplate")){
            templatePath = "/"+trimHeadAndTailChar(templatePath,"/") + "/one";
            GenCodeCfg.setTemplatePath(templatePath);
        }
        GenFileCfg fileCfg = new GenFileCfg(templatePath);
        config.setGenFileCfg(fileCfg);

        return config;
    }



    private String trimHeadAndTailChar(String str,String element) {
        boolean headIndexFlag = true;
        boolean tailIndexFlag = true;
        do{
            int headIndex = str.indexOf(element) == 0 ? 1:0;
            int tailIndex = str.lastIndexOf(element)+1 == str.length() ? str.lastIndexOf(element):str.length();
            str = str.substring(headIndex,tailIndex);
            headIndexFlag = str.indexOf(element) ==0;
            tailIndexFlag = (str.lastIndexOf(element)+1 == str.length());
        }while (headIndexFlag || tailIndexFlag);
        return str;
    }


}
